// inclusão de arquivos de cabeçalho (.h)
#include "io.h"

// referência externa para a função videomem
extern unsigned char *videomem;

/*

esta função imprime um caracter na tela
na posição indicada pelos parâmetros x e y.

a impressão é feita utilizando a função videomem

*/
void imprime_char (char tecla, int x, int y){

		//imprime na tela
		int posicao = (((80*y)+x)*2);
		videomem[posicao]   = tecla;
		videomem[posicao+1] = 0x0E; //define cor

} // fim da função imprime_char



/*

esta função captura a interrupção do teclado,
decodifica o scan code recebido e
imprime a tecla pressionada na tela

*/
void isr_keyboard(void) {

unsigned shift_state = 0; //tecla pressionada ou não

	//usa inb para receber o scancode
	char key = inb(0x60);
	
	//asm volatile("movl $0x66,%eax; loop1: jmp loop1;");
	
//	if (key = 0x2a) {  //shift_state = 1;	
//	}
	
	//if (key == 0xaa) shift_state = 0;
	//if (key == 01) ; //ESC
	//if (key == 1C) ; //ENTER
	//if (key == 3A) ; //CAPS
	
	/*
	
	as teclas são recebidas através de scan codes
	
	abaixo está um mapeamento para encontrar qual
	a tecla corresponde a qual scan code.
	
	*/
	
	if (key == 10) imprime_char('Q',1,1); //Q
	if (key == 11) imprime_char('W',1,1); //W
	if (key == 12) imprime_char('E',1,1); //E
	if (key == 13) imprime_char('R',1,1); //R
	if (key == 14) imprime_char('T',1,1); //T
	if (key == 15) imprime_char('Y',1,1); //Y
	if (key == 16) imprime_char('U',1,1); //U
	if (key == 17) imprime_char('I',1,1); //I
	if (key == 18) imprime_char('O',1,1); //O
	if (key == 19) imprime_char('P',1,1); //P
	if (key == 1E) imprime_char('A',1,1); //A
	if (key == 1F) imprime_char('S',1,1); //S
	if (key == 20) imprime_char('D',1,1); //D
	if (key == 21) imprime_char('F',1,1); //F
	if (key == 22) imprime_char('G',1,1); //G
	if (key == 23) imprime_char('H',1,1); //H
	if (key == 24) imprime_char('J',1,1); //J
	if (key == 25) imprime_char('K',1,1); //K
	if (key == 26) imprime_char('L',1,1); //L
	if (key == 2C) imprime_char('Z',1,1); //Z
	if (key == 2D) imprime_char('X',1,1); //X
	if (key == 2E) imprime_char('C',1,1); //C
	if (key == 2F) imprime_char('V',1,1); //V
	if (key == 30) imprime_char('B',1,1); //B
	if (key == 31) imprime_char('N',1,1); //N
	if (key == 32) imprime_char('M',1,1); //M
	
	//teclas numéricas
	if (key == 0B) imprime_char('0',1,1); //0
	if (key == 02) imprime_char('1',1,1); //1
	if (key == 03) imprime_char('2',1,1); //2
	if (key == 04) imprime_char('3',1,1); //3
	if (key == 05) imprime_char('4',1,1); //4
	if (key == 06) imprime_char('5',1,1); //5
	if (key == 07) imprime_char('6',1,1); //6
	if (key == 08) imprime_char('7',1,1); //7
	if (key == 09) imprime_char('8',1,1); //8
	if (key == 0A) imprime_char('9',1,1); //9
	
	//teclas especiais
	if (key == 0C) imprime_char('-',1,1); //-
	if (key == 0D) imprime_char('=',1,1); //=
	if (key == 1A) imprime_char('[',1,1); //[
	if (key == 1B) imprime_char(']',1,1); //]
	if (key == 27) imprime_char(';',1,1); //;
	if (key == 33) imprime_char(',',1,1); //,
	if (key == 34) imprime_char('.',1,1); //.
	
} // fim da função isr_keyboard